数据结构:图及其应用 | 您所在的位置:网站首页 › 数据结构 图的实现方法 › 数据结构:图及其应用 |
目录 问题: 代码1(这是题目给的代码) 解析: 功能1: 功能2: 代码 代码2(自己写的) 前言 整体思路及运行情况 代码 问题:背景知识:图的存储、遍历及其应用,图的最短路径等。 目的要求: 掌握图的存储、构建、搜索等操作和应用,能用最短路径及其搜索等算法编制较综合性的程序,求解最优路线问题,进行程序设计、数据结构和算法设计等方面的综合训练。 实验内容: 1.任务:设计一个城市交通咨询模拟系统,利用该系统实现至少两种最优决策:最短路程到达、最省时到达等线路规划。 2.内容: 用户驾车出行由于出行目的的不同对道路路线选择的要求也有不同。例如,有的希望在途中的路程尽可能短,有的则可能希望路程中时间最短。为了能满足广大旅客的需求,编制一个城市交通咨询模拟系统,选取城市部分位置、道路抽象为程序所需要图的顶点和边,并以城市道路长度(路程),道路的某时段的速度等信息作为图结点中的弧信息,为旅客提供这两种最优决策的交通咨询。 实验说明: 1.输入和输出: (1)输入形式: 构建图时,输入顶点、弧涉及的信息,包括:起始地、目的地、长度、该弧此时间段的平均速度等信息;用户或者客户要输入出发地和目的地,并选择何种最优决策的路线规划。(2)输出形式:根据用户需求输出对应信息 输出最短路程所需要的路线信息和最短路程;输出最短时间所需要的路线信息和最短时间。2.实验要求: 实现一个简单的交互式界面,包括系统菜单、清晰的输入提示等。根据输入的交通图数据,以图形化形式把交通图显示在屏幕上。以图形化形式把最优路线显示在屏幕上。 代码1(这是题目给的代码) 解析:这个是实验指导书上的源码,挺好用 功能1:首先建立三个文本文件 count文件里面存的地方的个数,map文件里面存的是一个点到另一个点的距离,map_speed文件里面存的是 一个点到另一个点的时间 看map里面的1,处于第1行第2列,就是第一个点到第二个点的距离是1, map_speed的1.1就是第1个点到第2个点的花费的时间是1.1 这是我用的测试点
下面正式开始测试,首先你要改一下代码中的文件的路径,
运行结果图 我们可以根据之前的测试图,可以看到它的路线 功能2:录入路线 把代码中的写入的路径更改一下 这个输入的是两个点是双向都可以通的,点1到点2 的距离是1速度是1, 思路:很简单,就是用弗罗伊德算法,计算出权值最小的路径,顺便用记录中间的一些中转点,在最后的输出路径中输出出来。 弗罗里达算法思想,想具体知道弗罗里达算法算法自己在网上搜一下吧看吧。 代码稍微加了一些注释,这个给的代码很简单,应该不用多说吧,不会真的有人看不懂吧 #include #include #define inf 99999999 #define max_element 50 int e[max_element][max_element]; //保存地图的数组 int path_e[max_element][max_element], path_t[max_element][max_element];//转折点的路径 double t[max_element][max_element]; //保存地图的速度 void Menu(); void Old_Map(); void New_Map(); void Floyd(int (*e)[max_element],double (*t)[max_element], int n); //计算最短路径 void Floyd_dist(int (*e)[max_element], int n, int start, int end); void Floyd_time(double (*e)[max_element], int n, int start, int end); int main() { int Mu=5; Menu(); while(scanf("%d", &Mu), Mu!=0) { switch(Mu)//菜单选项 { case 1: Old_Map();break; case 2: New_Map();break; case 3: system("cls");break; default:printf("\n请输入正确指令!!!");break; } Menu(); } printf("\n成功退出!"); return 0; } void Menu() { printf("\n ---选择使用已保存的地图:1---"); printf("\n\n ---选择重新录入地图信息:2---\n"); printf("\n -----------清屏:3-----------\n"); printf("\n -------------退出:0-------------\n"); } //使用原有地图 void Old_Map() { int i, j; FILE *fp; int count = 0; //读入文档count.txt if((fp=fopen("C:\\Users\\jin\\Desktop\\count.txt","r")) == NULL) { printf("File open failed!\n"); exit(0); } fscanf(fp,"%d", &count);//读入点数 fclose(fp); printf("顶点个数 == %d\n", count); if(count == 0 ) { printf("\n信息读入错误!!\n错误原因:没有已保存的地图,请选择重新输入地图信息!!\n"); return ; } ///读入文档map.txt if((fp=fopen("C:\\Users\\jin\\Desktop\\map.txt","r")) == NULL) { printf("File open failed!\n"); exit(0); } for(i = 1; i %d", end); printf("\n___________________________________________\n"); } void Floyd_time(double (*t)[max_element], int n, int start, int end) { int k, i, j; ///佛洛依德算法---时间 for(k = 1; k |
CopyRight 2018-2019 实验室设备网 版权所有 |